"""
【拷贝】
Definition: 原型模式（Prototype Pattern）：允许通过复制现有对象来创建新的对象，而无需重新实例化。

Think: 首先定义一个抽象原型类，包含了用于复制自身的抽象方法 clone()。然后，定义具体的原型类。
       最后，在客户端代码中，可以通过调用具体对象 clone() 方法来创建新的对象，而无需重新实例化。（注意深浅拷贝问题）

优点：
    简化对象的创建，避免了重新实例化的过程。提高性能、创建效率。
    通过复制现有对象来创建新的对象，减少不必要的风险。
缺点：
    需要对每个类进行深度复制。复杂度和维护成本会变高。
    要注意对象构造函数被绕过的问题
"""
import copy


class Prototype:
    def clone(self):
        return copy.deepcopy(self)


class ConcretePrototype1(Prototype):
    def __init__(self, attr):
        self.attr = attr


class ConcretePrototype2(Prototype):
    def __init__(self, attr):
        self.attr = attr


if __name__ == '__main__':
    prototype_1 = ConcretePrototype1("attr_1")
    prototype_2 = ConcretePrototype2("attr_2")

    clone_1 = prototype_1.clone()
    clone_2 = prototype_2.clone()

    print(f"Original: ({prototype_1.attr}, {prototype_2.attr})")
    # 输出：Original: (attr_1, attr_2)
    print(f"Clone: ({clone_1.attr}, {clone_2.attr})")
    # 输出：Clone: (attr_1, attr_2)
